__author__ = 'chenwei'
# -*- coding: utf-8 -*-
'''
作业 写一个密码验证程序 正确的密码在文本里 需要你去比对 输入的密码 允许错误3次 超过3次 报错  注意编码风格 合理使用异常
第一步，先实现老师的要求。
第二步，增加了一个注册的需求。
第三步，增加一个md5的方法。账号创建的时候用md5值去保存，去除明文密码。在验证的时候输入的密码md5加密与保存的文件验证。
总结：总体来说，这次的作业还是有点难度，文件的创建，读取文件的分割等都遇到了一点困难。整体的业务逻辑也不够清晰。
      一些常遇到的异常到是处理了。可能会有一些隐性的bug。整体还是比较稚嫩，需要多磨练。
'''
import hashlib
passwd_file='passwd.txt'
menu_list='''----登录菜单----
|1)登录(Login)    |
|2)注册(Create)   |
|3)退出(Quit)     |
----------------
请输入数字(1-3)或(l,c,q)： '''
welcome_menu_list = '''----用户菜单----
|1)未开放         |
|2)未开放         |
|3)退出(Quit)     |
----------------
请输入数字(1-3)或(q)：'''

def md5_hash(arg):
    m2 = hashlib.md5()
    m2.update(arg.encode("utf-8"))  # 参数必须是byte类型，否则报Unicode-objects must be encoded before hashing错误
    return m2.hexdigest()

def welcome_interface(user_name):
    while True:
        menu_value = 0 #初始化输入的menu_value值
        print("尊敬的",user_name,"，您好：")
        print_menu(welcome_menu_list)
        menu_value = input()
        if menu_value == '1':
            print("该功能未开放")
        elif menu_value == '2':
            print("该功能未开放")
        elif menu_value == '3' or menu_value == 'q' or menu_value == 'Q':
            break
        else:
            print("输入有误，请重新输入。")

def login_account(): #登录函数
    print("用户登录")
    login_user_name = input("请输入用户名:")
    for i in range(0,3):
        login_user_passwd = input("请输入密码:")
        login_result = check_passwd(login_user_name, login_user_passwd)
        if not login_result:
            print("登录失败。用户不存在或密码错误。请重试")
        else:
            print("登录成功。")
            welcome_interface(login_user_name)
            break
    else:
        print("输入错误超过三次，退出！")
def check_passwd(username, passwd, create_user=False): #登录检验密码函数
    try:
        the_file = open(passwd_file)
    except FileNotFoundError:
        the_file = open(passwd_file, 'xt')
    else:
        line = the_file.readline()
        while line:
            line = line.strip("\n")
            file_user_name,file_user_pass = line.split(':',1)
            passwd_md5 = md5_hash(passwd)
            if file_user_name == username: # 是否有相同的用户名
                if create_user : #查询是否有同名用户，相同则返回True。
                    return True
                elif file_user_pass == passwd_md5: #不是创建用户，判断两个密码是否相同，相同则返回True。
                    return True
            line = the_file.readline()
        return False
    finally:
        the_file.close()

def insert_account_to_passwd_file(username, passwd): #插入新的用户和密码到数据文件。
    try:
        the_file = open(passwd_file,'at')
    except FileNotFoundError:
        the_file = open(passwd_file,'xt') #未找到密码文件,创建一个新的密码文件。
    else:
        passwd_md5 = md5_hash(passwd)
        print(username, passwd_md5,file=the_file,sep=':')
    finally:
        the_file.close()

def create_account(): #创建账号函数
    print("创建新用户")
    create_user_name = input("请输入用户名:")
    create_user_passwd1 = input("请输入密码:")
    create_user_passwd2 = input("请再次输入密码:")
    if create_user_passwd1 == create_user_passwd2:
        print("开始创建...")
        create_result = check_passwd(create_user_name, create_user_passwd1, create_user=True)
        print(create_result)
        if not create_result:
            insert_account_to_passwd_file(create_user_name, create_user_passwd1)
            print("创建",create_user_name,"成功。")
        else:
            print("创建失败，用户名相同。")
    else:
        print("创建失败,两次密码输入不相同。")

def print_menu(this_list): #打印主页菜单
    print(this_list,end='')

def interactive_interface():
    while True:
        menu_value = 0 #初始化输入的menu_value值
        print_menu(menu_list)
        menu_value = input()
        if menu_value == '1' or menu_value == 'l' or menu_value == 'L':
            login_account()
        elif menu_value == '2' or menu_value == 'c' or menu_value == 'C':
            create_account()
        elif menu_value == '3' or menu_value == 'q' or menu_value == 'Q':
            break
        else:
            print("输入有误，请重新输入。")

if __name__ ==  __name__ :
    interactive_interface()

